package main

import "fmt"

// Person
// 嵌套结构体
type Person struct {
	Name    string
	Age     int
	Address Address
}

// Person2
// 匿名 嵌套结构体
type Person2 struct {
	Name string
	Age  int
	Address
}

type Company struct {
	Name    string
	Address Address
}

type Address struct {
	Province string
	City     string
}

func main() {
	p1 := &Person{
		Name: "张三",
		Age:  20,
		Address: Address{
			Province: "广东",
			City:     "广州",
		},
	}

	fmt.Printf("%#v\n", p1)
	fmt.Printf("%v %v\n", p1.Address.Province, p1.Address.City)

	fmt.Println("=========================================================")

	p2 := &Person2{
		Name: "李四",
		Age:  20,
		Address: Address{
			Province: "广东",
			City:     "广州",
		},
	}

	fmt.Printf("%#v\n", p2)
	fmt.Printf("%v %v\n", p2.Address.Province, p2.Address.City)
	// 匿名结构体 先在自己的 结构体中 寻找 字段 若 找不到 则 从 匿名嵌套结构体中 查找
	// 如果 多个匿名嵌套结构体中 有字段冲突 则只能使用 类型名.字段名 访问
	fmt.Printf("%v %v\n", p2.Province, p2.City)
}
